﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;


//// Static成员
//class A {
//public:
//	A(int n = 1)
//		:_n(n)
//	{
//		cout << _n << endl;
//	}
//
//	// static成员函数不可以访问static成员变量以外的其他成员变量
//	static void Print()
//	{
//		//cout << _n << endl;
//		cout <<_m << endl;
//	}
//	// 普通成员函数可以访问static成员变量
//	void Get()
//	{
//		cout << "_m:" << _m << "_n:" << _n << endl;
//	}
//
////private:
//	int _n;
//	static int _m;
//};
//
//// static成员函数在类外面初始化
//int	A:: _m = 12;
//
//int main()
//{
//	A a(32);
//
//	a.Get();
//
//	return 0;
//}





//// friend友元函数
//
//class B; // 需要前置声明一下B类，因为B类定义在了A类的下面，在A类中访问B类找不到
//class A {
//	friend void GetPri(const A& a, const B& b);
//public:
//	A(int w = 3, int u = 5)
//		:_w(w)
//		,_u(u)
//	{
//		cout << "A(int w = 3, int u = 5)" << endl;
//	}
//private:
//	int _w;
//	int _u;
//};
//
//class B {
//	friend void GetPri(const A& a, const B& b);
//	friend class A;
//public:
//	B(int  n, int m)
//		:_n(n)
//		, _m(m)
//	{
//		cout << "B(int  n, int m)" << endl;
//	}
//
//private:
//	int _n;
//	int _m;
//};
//
//// 一个函数可以是多个类的友元函数
//// 友元函数不是成员函数，定义在外面
//void GetPri(const A& a, const B& b)
//{
//	// 需要实例化对象才能访问对象里面的成员变量
//	cout << b._m << endl;
//	cout << a._u << endl;
//}
//
//int main()
//{
//	B b(1,2);
//	A a;
//
//	GetPri(a, b);
//
//	return 0;
//}





//// 内部类
//class A{
//private:
//	static int _k;
//	int _h = 1;
//public:
//	class B // B默认就是A的友元
//	{
//	public:
//		void foo(const A& a)
//		{
//			cout << _k << endl; //OK
//			cout << a._h << endl; //OK
//		}
//	};
//};
//
//int A::_k = 1;
//
//// 内部类使用案例
//class Solution {
//	// 内部类
//	class Sum
//	{
//	public :
//		Sum()
//		{
//			_ret += _i;
//			++_i;
//		}
//	};
//	static int _i;
//	static int _ret;
//public:
//	int Sum_Solution(int n) {
//		// 变⻓数组
//		Sum arr[n];
//		return _ret;
//	}
//};
//int Solution::_i = 1;
//int Solution::_ret = 0;
//
//
//int main()
//{
//	cout << sizeof(A) << endl;
//	A::B b;
//	A aa;
//	b.foo(aa);
//
//	return 0;
//}




// 匿名对象
class B {
public:
	B(int  n, int m)
		:_n(n)
		, _m(m)
	{
		cout << "B(int  n, int m)" << endl;
	}

private:
	int _n;
	int _m;
};

int main()
{
	// 有名对象
	// 不能这样定义对象：B bb(); 分不清是函数声明还是对象定义
	B bb(12, 32);

	//匿名对象
	B(1, 2);
	// 生命周期只在当前行，过了当前行就自动调用析构函数销毁了

	return 0;
}